package com.universest.swordholder.model.config
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.*
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking

// 扩展属性，创建DataStore实例
private val Context.appDataStore: DataStore<Preferences> by preferencesDataStore(name = "app_config")

class ConfigManager(private val dataStore: DataStore<Preferences>) {

    companion object {
        fun getAppConfig(context: Context): ConfigManager {
            return ConfigManager(context.appDataStore)
        }
    }

    /**
     * 根据key获取配置项的Flow
     * 当配置项发生变化时，会自动发射新值
     */
    fun getConfig(key: String,default: String? = null): Flow<String?> {
        return dataStore.data
            .map { preferences ->
                preferences[stringPreferencesKey(key)] ?: default
            }
    }

    /**
     * 保存或更新配置项
     * @param key 配置项键
     * @param value 配置项值
     */
    suspend fun saveConfig(key: String, value: String) {
        dataStore.edit { preferences ->
            preferences[stringPreferencesKey(key)] = value
        }
    }

    /**
     * 删除指定配置项
     * @param key 要删除的配置项键
     */
    suspend fun removeConfig(key: String) {
        dataStore.edit { preferences ->
            preferences.remove(stringPreferencesKey(key))
        }
    }

    /**
     * 同步获取配置项（不推荐在主线程使用）
     * 主要用于非协程环境下的临时获取
     */
    fun getConfigSync(key: String,default: String?): String? = runBlocking {
        getConfig(key, default).first()
    }

    /**
     * 清除所有配置项
     */
    suspend fun clearAll() {
        dataStore.edit { it.clear() }
    }
}